﻿using System;
using System.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CubaLibreBar.Model.Core.Entities;
using System.Data.SqlClient;
using System.Data.SqlServerCe;

namespace CubaLibreBar.Model.Dados
{
    public static class ProdutosDAO
    {

        /// <summary>
        /// Pega uma lista de todos os Produtos gravados no banco de dados
        /// </summary>
        /// <returns></returns>
        public static List<Produtos> GetAllProdutos()
        {
            List<Produtos> produtos = new List<Produtos>();

            try
            {
                using (SqlCeConnection connection = ConnectionFactory.GetConnection())
                {
                    connection.Open();

                    using (SqlCeCommand cmd = connection.CreateCommand())
                    {
                        cmd.CommandText = @"SELECT * FROM tbProdutos";
                        SqlCeDataReader reader = cmd.ExecuteReader();

                        while (reader.Read())
                        {
                            Produtos produto = new Produtos();
                            produto.IdProduto = Convert.ToInt64(reader["IdProduto"]);
                            produto.NomeProduto = Convert.ToString(reader["NomeProduto"]);
                            produto.QuantidadeProduto = Convert.ToInt32(reader["QuantidadeProduto"]);
                            produto.PrecoCompra = Convert.ToDecimal(reader["PrecoCompra"]);
                            produto.PrecoVenda = Convert.ToDecimal(reader["PrecoVenda"]);

                            produtos.Add(produto);
                        }

                        reader.Close();
                    }

                    connection.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }

            return produtos;
        }

        /// <summary>
        /// Pega uma lista de todos os Produtos gravados no banco de dados
        /// </summary>
        /// <returns></returns>
        public static List<Produtos> GetAllProdutosWithWhere(int? idProduto, string nomeProduto)
        {
            List<Produtos> produtos = new List<Produtos>();

            try
            {
                using (SqlCeConnection connection = ConnectionFactory.GetConnection())
                {
                    connection.Open();

                    using (SqlCeCommand cmd = connection.CreateCommand())
                    {
                        StringBuilder query = new StringBuilder("SELECT * FROM tbProdutos");
                        
                        // FILTROS
                        if (idProduto != null && nomeProduto != null)
                        {
                            query.Append(" WHERE IdProduto = @IdProduto AND NomeProduto LIKE @NomeProduto");
                            cmd.Parameters.Add("@IdProduto", idProduto);
                            cmd.Parameters.Add("@NomeProduto", "%" + nomeProduto + "%");
                        }
                        else if (idProduto != null)
                        {
                            query.Append(" WHERE IdProduto = @IdProduto");
                            cmd.Parameters.Add("@IdProduto", idProduto);
                        }
                        else if (nomeProduto != null)
                        {
                            query.Append(" WHERE NomeProduto LIKE @NomeProduto");
                            cmd.Parameters.Add("@NomeProduto", "%" + nomeProduto + "%");
                        }

                        cmd.CommandText = @"" + query;
                        SqlCeDataReader reader = cmd.ExecuteReader();

                        while (reader.Read())
                        {
                            Produtos produto = new Produtos();
                            produto.IdProduto = Convert.ToInt64(reader["IdProduto"]);
                            produto.NomeProduto = Convert.ToString(reader["NomeProduto"]);
                            produto.QuantidadeProduto = Convert.ToInt32(reader["QuantidadeProduto"]);
                            produto.PrecoCompra = Convert.ToDecimal(reader["PrecoCompra"]);
                            produto.PrecoVenda = Convert.ToDecimal(reader["PrecoVenda"]);

                            produtos.Add(produto);
                        }

                        reader.Close();
                    }

                    connection.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }

            return produtos;
        }

        /// <summary>
        // Grava uma entidade Produtos no banco de dados
        /// </summary>
        /// <param name="produto"></param>
        public static void CreateProduto(Produtos produto)
        {
            using (SqlCeConnection connection = ConnectionFactory.GetConnection())
            {
                connection.Open();

                using (SqlCeCommand cmd = connection.CreateCommand())
                {
                    cmd.CommandText =
                        "INSERT INTO tbProdutos(NomeProduto, QuantidadeProduto, PrecoCompra, PrecoVenda) VALUES (@NomeProduto, @QuantidadeProduto, @PrecoCompra, @PrecoVenda)";
                    cmd.Parameters.Add(new SqlCeParameter("@NomeProduto", produto.NomeProduto));
                    cmd.Parameters.Add(new SqlCeParameter("@QuantidadeProduto", produto.QuantidadeProduto));
                    cmd.Parameters.Add(new SqlCeParameter("@PrecoCompra", produto.PrecoCompra));
                    cmd.Parameters.Add(new SqlCeParameter("@PrecoVenda", produto.PrecoVenda));

                    cmd.ExecuteNonQuery();
                }

                connection.Close();
            }
        }

        /// <summary>
        /// Consulta um Produto no Banco de Dados por IdProduto
        /// </summary>
        /// <param name="idProduto"></param>
        /// <returns></returns>
        public static Produtos GetById(long idProduto)
        {
            Produtos produto = new Produtos();

            try
            {
                using (SqlCeConnection connection = ConnectionFactory.GetConnection())
                {
                    connection.Open();

                    using (SqlCeCommand cmd = connection.CreateCommand())
                    {
                        cmd.CommandText = @"SELECT * FROM tbProdutos WHERE IdProduto = @IdProduto";
                        cmd.Parameters.Add(new SqlCeParameter("@IdProduto", idProduto));

                        SqlCeDataReader reader = cmd.ExecuteReader();

                        while (reader.Read())
                        {
                            produto.IdProduto = Convert.ToInt64(reader["IdProduto"]);
                            produto.NomeProduto = Convert.ToString(reader["NomeProduto"]);
                            produto.QuantidadeProduto = Convert.ToInt32(reader["QuantidadeProduto"]);
                            produto.PrecoCompra = Convert.ToDecimal(reader["PrecoCompra"]);
                            produto.PrecoVenda = Convert.ToDecimal(reader["PrecoVenda"]);
                        }

                        reader.Close();
                    }

                    connection.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }

            return produto;
        }

        /// <summary>
        /// Atualiza um produto no banco de dados
        /// </summary>
        /// <param name="produto"></param>
        public static void UpdateProduto(Produtos produto)
        {
            try
            {
                using (SqlCeConnection connection = ConnectionFactory.GetConnection())
                {
                    connection.Open();

                    using (SqlCeCommand cmd = connection.CreateCommand())
                    {
                        cmd.CommandText =
                            @"UPDATE tbProdutos SET 
                              NomeProduto = @NomeProduto, 
                              QuantidadeProduto = @QuantidadeProduto, 
                              PrecoCompra = @PrecoCompra, 
                              PrecoVenda = @PrecoVenda
                              WHERE IdProduto = @IdProduto";
                        cmd.Parameters.Add(new SqlCeParameter("@NomeProduto", produto.NomeProduto));
                        cmd.Parameters.Add(new SqlCeParameter("@QuantidadeProduto", produto.QuantidadeProduto));
                        cmd.Parameters.Add(new SqlCeParameter("@PrecoCompra", produto.PrecoCompra));
                        cmd.Parameters.Add(new SqlCeParameter("@PrecoVenda", produto.PrecoVenda));
                        cmd.Parameters.Add(new SqlCeParameter("@IdProduto", produto.IdProduto));

                        cmd.ExecuteNonQuery();
                    }

                    connection.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public static void UpdateProduto(Produtos produto, SqlCeConnection connection)
        {
            connection.Open();

            using (SqlCeCommand cmd = connection.CreateCommand())
            {
                cmd.CommandText =
                    @"UPDATE tbProdutos SET 
                        NomeProduto = @NomeProduto, 
                        QuantidadeProduto = @QuantidadeProduto, 
                        PrecoCompra = @PrecoCompra, 
                        PrecoVenda = @PrecoVenda
                        WHERE IdProduto = @IdProduto";
                cmd.Parameters.Add(new SqlCeParameter("@NomeProduto", produto.NomeProduto));
                cmd.Parameters.Add(new SqlCeParameter("@QuantidadeProduto", produto.QuantidadeProduto));
                cmd.Parameters.Add(new SqlCeParameter("@PrecoCompra", produto.PrecoCompra));
                cmd.Parameters.Add(new SqlCeParameter("@PrecoVenda", produto.PrecoVenda));
                cmd.Parameters.Add(new SqlCeParameter("@IdProduto", produto.IdProduto));

                cmd.ExecuteNonQuery();
            }

            connection.Close();
        }

        /// <summary>
        /// Atualiza um produto no banco de dados
        /// </summary>
        /// <param name="produto"></param>
        public static void UpdateQuantidadeProduto(long idProduto, int quantidade, SqlCeConnection connection)
        {
            using (SqlCeCommand cmd = connection.CreateCommand())
            {
                cmd.CommandText =
                    @"UPDATE tbProdutos SET 
                            QuantidadeProduto = @QuantidadeProduto
                            WHERE IdProduto = @IdProduto";
                cmd.Parameters.Add(new SqlCeParameter("@QuantidadeProduto", quantidade));
                cmd.Parameters.Add(new SqlCeParameter("@IdProduto", idProduto));

                cmd.ExecuteNonQuery();
            }
        }

        /// <summary>
        /// Deleta um produto no banco de dados
        /// </summary>
        /// <param name="idProduto"></param>
        public static void DeleteProduto(int idProduto)
        {
            try
            {
                using (SqlCeConnection connection = ConnectionFactory.GetConnection())
                {
                    connection.Open();

                    using (SqlCeCommand cmd = connection.CreateCommand())
                    {
                        cmd.CommandText = @"DELETE tbProdutos WHERE IdProduto = @IdProduto";
                        cmd.Parameters.Add(new SqlCeParameter("@IdProduto", idProduto));

                        cmd.ExecuteNonQuery();
                    }

                    connection.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}
